﻿//------------------------------------------------------------------------------
// ╭─────────────────────────────╮
// │ ╭─╮     ╭─╮              TM │   ╠═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╣
// │ │ │     │ │                 │                                           ☺      
// │ │ ╰───╮ │ │ ╭─────╮ ╭─────╮ │     Name:Wedn.Net 缓存层抽象基类      ♮ ♪ ♩
// │ │ ╭─╮ │ │ │ │ ╭─╮ │ │ ╭─╮ │ │                                    ♫ ♭      
// │ │ ╰─╯ │ │ │ │ ╰─╯ │ │ ╰─╯ │ │     Author:iceStone               ♬ ♪       
// │ └─────╯ └─╯ ╰─────╯ ╰───╮ │ │     Chinese:汪磊                              
// │                     ┌───╯ │ │                                              
// │                     ╰─────╯ │   ╠═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╣
// ╰─────────────────────────────╯                                              
//------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using Wedn.Net.Utility;

namespace Wedn.Net.Cache
{
    /// <summary>
    /// 缓存层抽象基类
    /// </summary>
    /// <typeparam name="T">缓存数据类型</typeparam>
    public abstract class BaseCache<T> where T : class
    {
        private string _cacheKey;
        private object _lockHelper;
        /// <summary>
        /// 缓存层抽象类构造函数
        /// </summary>
        /// <param name="key">缓存键</param>
        /// <param name="lockHelper"></param>
        protected BaseCache(string key, object lockHelper) { _cacheKey = key; _lockHelper = lockHelper; }

        /// <summary>
        /// 数据
        /// </summary>
        protected T Data { get; set; }
        /// <summary>
        /// 获取缓存数据
        /// </summary>
        /// <returns>缓存数据</returns>
        public T GetCacheData()
        {
            Data = CacheHelper.GetCache<T>(_cacheKey);
            if (Data == null)
            {
                lock (_lockHelper)
                {
                    if (Data == null) RefreshData();
                }
            }
            return Data;
        }
        /// <summary>
        /// 重新刷新缓存数据
        /// </summary>
        public abstract void RefreshData();
    }
}
